
(function($){
    var PROP_NAME='datepicker';
    function Datepicker(){
        this.debug=false;
        this._curInst=null;
        this._disabledInputs=[];
        this._datepickerShowing=false;
        this._inDialog=false;
        this._mainDivId='ui-datepicker-div';
        this._appendClass='ui-datepicker-append';
        this._triggerClass='ui-datepicker-trigger';
        this._dialogClass='ui-datepicker-dialog';
        this._promptClass='ui-datepicker-prompt';
        this._unselectableClass='ui-datepicker-unselectable';
        this._currentClass='ui-datepicker-current-day';
        this.regional=[];
        this.regional['']={
            clearText:'Clear',
            clearStatus:'Erase the current date',
            closeText:'Close',
            closeStatus:'Close without change',
            prevText:'&#x3c;Prev',
            prevStatus:'Show the previous month',
            nextText:'Next&#x3e;',
            nextStatus:'Show the next month',
            currentText:'Today',
            currentStatus:'Show the current month',
            monthNames:['January','February','March','April','May','June','July','August','September','October','November','December'],
            monthNamesShort:['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],
            monthStatus:'Show a different month',
            yearStatus:'Show a different year',
            weekHeader:'Wk',
            weekStatus:'Week of the year',
            dayNames:['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
            dayNamesShort:['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],
            dayNamesMin:['Su','Mo','Tu','We','Th','Fr','Sa'],
            dayStatus:'Set DD as first week day',
            dateStatus:'Select DD, M d',
            dateFormat:'mm/dd/yy',
            firstDay:0,
            initStatus:'Select a date',
            isRTL:false
        };
        
        this._defaults={
            showOn:'focus',
            showAnim:'show',
            showOptions:{},
            defaultDate:null,
            appendText:'',
            buttonText:'...',
            buttonImage:'',
            buttonImageOnly:false,
            closeAtTop:true,
            mandatory:false,
            hideIfNoPrevNext:false,
            navigationAsDateFormat:false,
            gotoCurrent:false,
            changeMonth:true,
            changeYear:true,
            yearRange:'-100:+50',
            changeFirstDay:true,
            highlightWeek:false,
            showOtherMonths:false,
            showWeeks:false,
            calculateWeek:this.iso8601Week,
            shortYearCutoff:'+10',
            showStatus:false,
            statusForDate:this.dateStatus,
            minDate:null,
            maxDate:null,
            duration:'normal',
            beforeShowDay:null,
            beforeShow:null,
            onSelect:null,
            onChangeMonthYear:null,
            onClose:null,
            numberOfMonths:1,
            stepMonths:1,
            rangeSelect:false,
            rangeSeparator:' - ',
            altField:'',
            altFormat:''
        };
        
        $.extend(this._defaults,this.regional['']);
        this.dpDiv=$('<div id="'+this._mainDivId+'" style="display: none;"></div>');
    }
    $.extend(Datepicker.prototype,{
        markerClassName:'hasDatepicker',
        log:function(){
            if(this.debug)
                console.log.apply('',arguments);
        },
        setDefaults:function(settings){
            extendRemove(this._defaults,settings||{});
            return this;
        },
        _attachDatepicker:function(target,settings){
            var inlineSettings=null;
            for(attrName in this._defaults){
                var attrValue=target.getAttribute('date:'+attrName);
                if(attrValue){
                    inlineSettings=inlineSettings||{};
                    
                    try{
                        inlineSettings[attrName]=eval(attrValue);
                    }catch(err){
                        inlineSettings[attrName]=attrValue;
                    }
                }
            }
    var nodeName=target.nodeName.toLowerCase();
        var inline=(nodeName=='div'||nodeName=='span');
        if(!target.id)
        target.id='dp'+new Date().getTime();
   
    var inst=this._newInst($(target),inline);
        inst.settings=$.extend({},settings||{},inlineSettings||{});
        if(nodeName=='input'){
        this._connectDatepicker(target,inst);
    }else if(inline){
        this._inlineDatepicker(target,inst);
    }
    },
_newInst:function(target,inline){
    return{
        id:target[0].id,
        input:target,
        selectedDay:0,
        selectedMonth:0,
        selectedYear:0,
        drawMonth:0,
        drawYear:0,
        inline:inline,
        dpDiv:(!inline?this.dpDiv:$('<div class="ui-datepicker-inline"></div>'))
        };
    
},
_connectDatepicker:function(target,inst){
    var input=$(target);
    if(input.hasClass(this.markerClassName))
        return;
    var appendText=this._get(inst,'appendText');
    var isRTL=this._get(inst,'isRTL');
    if(appendText)
        input[isRTL?'before':'after']('<span class="'+this._appendClass+'">'+appendText+'</span>');
    var showOn=this._get(inst,'showOn');
    if(showOn=='focus'||showOn=='both')
        input.focus(this._showDatepicker);
    if(showOn=='button'||showOn=='both'){
        var buttonText=this._get(inst,'buttonText');
        var buttonImage=this._get(inst,'buttonImage');
        var trigger=$(this._get(inst,'buttonImageOnly')?$('<img/>').addClass(this._triggerClass).attr({
            src:buttonImage,
            alt:buttonText,
            title:buttonText
        }):$('<button type="button"></button>').addClass(this._triggerClass).html(buttonImage==''?buttonText:$('<img/>').attr({
            src:buttonImage,
            alt:buttonText,
            title:buttonText
        })));
        input[isRTL?'before':'after'](trigger);
        trigger.click(function(){
            if($.datepicker._datepickerShowing&&$.datepicker._lastInput==target)
                $.datepicker._hideDatepicker();else
                $.datepicker._showDatepicker(target);
            return false;
        });
    }
    input.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).bind("setData.datepicker",function(event,key,value){
        inst.settings[key]=value;
    }).bind("getData.datepicker",function(event,key){
        return this._get(inst,key);
    });
    $.data(target,PROP_NAME,inst);
},
_inlineDatepicker:function(target,inst){
    var input=$(target);
    if(input.hasClass(this.markerClassName))
        return;
    input.addClass(this.markerClassName).append(inst.dpDiv).bind("setData.datepicker",function(event,key,value){
        inst.settings[key]=value;
    }).bind("getData.datepicker",function(event,key){
        return this._get(inst,key);
    });
    $.data(target,PROP_NAME,inst);
    this._setDate(inst,this._getDefaultDate(inst));
    this._updateDatepicker(inst);
},
_inlineShow:function(inst){
    var numMonths=this._getNumberOfMonths(inst);
    inst.dpDiv.width(numMonths[1]*$('.ui-datepicker',inst.dpDiv[0]).width());
},
_dialogDatepicker:function(input,dateText,onSelect,settings,pos){
    var inst=this._dialogInst;
    if(!inst){
        var id='dp'+new Date().getTime();
        this._dialogInput=$('<input type="text" id="'+id+'" size="1" style="position: absolute; top: -100px;"/>');
        this._dialogInput.keydown(this._doKeyDown);
        $('body').append(this._dialogInput);
        inst=this._dialogInst=this._newInst(this._dialogInput,false);
        inst.settings={};
        
        $.data(this._dialogInput[0],PROP_NAME,inst);
    }
    extendRemove(inst.settings,settings||{});
    this._dialogInput.val(dateText);
    this._pos=(pos?(pos.length?pos:[pos.pageX,pos.pageY]):null);
    if(!this._pos){
        var browserWidth=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth;
        var browserHeight=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight;
        var scrollX=document.documentElement.scrollLeft||document.body.scrollLeft;
        var scrollY=document.documentElement.scrollTop||document.body.scrollTop;
        this._pos=[(browserWidth/2)-100+scrollX,(browserHeight/2)-150+scrollY];
    }
    this._dialogInput.css('left',this._pos[0]+'px').css('top',this._pos[1]+'px');
    inst.settings.onSelect=onSelect;
    this._inDialog=true;
    this.dpDiv.addClass(this._dialogClass);
    this._showDatepicker(this._dialogInput[0]);
    if($.blockUI)
        $.blockUI(this.dpDiv);
    $.data(this._dialogInput[0],PROP_NAME,inst);
    return this;
},
_destroyDatepicker:function(target){
    var nodeName=target.nodeName.toLowerCase();
    var $target=$(target);
    $.removeData(target,PROP_NAME);
    if(nodeName=='input'){
        $target.siblings('.'+this._appendClass).remove().end().siblings('.'+this._triggerClass).remove().end().removeClass(this.markerClassName).unbind('focus',this._showDatepicker).unbind('keydown',this._doKeyDown).unbind('keypress',this._doKeyPress);
    }else if(nodeName=='div'||nodeName=='span')
        $target.removeClass(this.markerClassName).empty();
},
_enableDatepicker:function(target){
    target.disabled=false;
    $(target).siblings('button.'+this._triggerClass).each(function(){
        this.disabled=false;
    }).end().siblings('img.'+this._triggerClass).css({
        opacity:'1.0',
        cursor:''
    });
    this._disabledInputs=$.map(this._disabledInputs,function(value){
        return(value==target?null:value);
    });
},
_disableDatepicker:function(target){
    target.disabled=true;
    $(target).siblings('button.'+this._triggerClass).each(function(){
        this.disabled=true;
    }).end().siblings('img.'+this._triggerClass).css({
        opacity:'0.5',
        cursor:'default'
    });
    this._disabledInputs=$.map(this._disabledInputs,function(value){
        return(value==target?null:value);
    });
    this._disabledInputs[this._disabledInputs.length]=target;
},
_isDisabledDatepicker:function(target){
    if(!target)
        return false;
    for(var i=0;i<this._disabledInputs.length;i++){
        if(this._disabledInputs[i]==target)
            return true;
    }
    return false;
},
_changeDatepicker:function(target,name,value){
    var settings=name||{};
    
    if(typeof name=='string'){
        settings={};
        
        settings[name]=value;
    }
    if(inst=$.data(target,PROP_NAME)){
        extendRemove(inst.settings,settings);
        this._updateDatepicker(inst);
    }
},
_setDateDatepicker:function(target,date,endDate){
    var inst=$.data(target,PROP_NAME);
    if(inst){
        this._setDate(inst,date,endDate);
        this._updateDatepicker(inst);
    }
},
_getDateDatepicker:function(target){
    var inst=$.data(target,PROP_NAME);
    if(inst)
        this._setDateFromField(inst);
    return(inst?this._getDate(inst):null);
},
_doKeyDown:function(e){
    var inst=$.data(e.target,PROP_NAME);
    var handled=true;
    if($.datepicker._datepickerShowing)
        switch(e.keyCode){
            case 9:
                $.datepicker._hideDatepicker(null,'');
                break;
            case 13:
                $.datepicker._selectDay(e.target,inst.selectedMonth,inst.selectedYear,$('td.ui-datepicker-days-cell-over',inst.dpDiv)[0]);
                return false;
                break;
            case 27:
                $.datepicker._hideDatepicker(null,$.datepicker._get(inst,'duration'));
                break;
            case 33:
                $.datepicker._adjustDate(e.target,(e.ctrlKey?-1:-$.datepicker._get(inst,'stepMonths')),(e.ctrlKey?'Y':'M'));
                break;
            case 34:
                $.datepicker._adjustDate(e.target,(e.ctrlKey?+1:+$.datepicker._get(inst,'stepMonths')),(e.ctrlKey?'Y':'M'));
                break;
            case 35:
                if(e.ctrlKey)$.datepicker._clearDate(e.target);
                break;
            case 36:
                if(e.ctrlKey)$.datepicker._gotoToday(e.target);
                break;
            case 37:
                if(e.ctrlKey)$.datepicker._adjustDate(e.target,-1,'D');
                break;
            case 38:
                if(e.ctrlKey)$.datepicker._adjustDate(e.target,-7,'D');
                break;
            case 39:
                if(e.ctrlKey)$.datepicker._adjustDate(e.target,+1,'D');
                break;
            case 40:
                if(e.ctrlKey)$.datepicker._adjustDate(e.target,+7,'D');
                break;
            default:
                handled=false;
        }
    else if(e.keyCode==36&&e.ctrlKey)
        $.datepicker._showDatepicker(this);else
        handled=false;
    if(handled){
        e.preventDefault();
        e.stopPropagation();
    }
},
_doKeyPress:function(e){
    var inst=$.data(e.target,PROP_NAME);
    var chars=$.datepicker._possibleChars($.datepicker._get(inst,'dateFormat'));
    var chr=String.fromCharCode(e.charCode==undefined?e.keyCode:e.charCode);
    return e.ctrlKey||(chr<' '||!chars||chars.indexOf(chr)>-1);
},
_showDatepicker:function(input){
    input=input.target||input;
    if(input.nodeName.toLowerCase()!='input')
        input=$('input',input.parentNode)[0];
    if($.datepicker._isDisabledDatepicker(input)||$.datepicker._lastInput==input)
        return;
    var inst=$.data(input,PROP_NAME);
    var beforeShow=$.datepicker._get(inst,'beforeShow');
    extendRemove(inst.settings,(beforeShow?beforeShow.apply(input,[input,inst]):{}));
    $.datepicker._hideDatepicker(null,'');
    $.datepicker._lastInput=input;
    $.datepicker._setDateFromField(inst);
    if($.datepicker._inDialog)
        input.value='';
    if(!$.datepicker._pos){
        $.datepicker._pos=$.datepicker._findPos(input);
        $.datepicker._pos[1]+=input.offsetHeight;
    }
    var isFixed=false;
    $(input).parents().each(function(){
        isFixed|=$(this).css('position')=='fixed';
        return!isFixed;
    });
    if(isFixed&&$.browser.opera){
        $.datepicker._pos[0]-=document.documentElement.scrollLeft;
        $.datepicker._pos[1]-=document.documentElement.scrollTop;
    }
    var offset={
        left:$.datepicker._pos[0],
        top:$.datepicker._pos[1]
        };
        
    $.datepicker._pos=null;
    inst.rangeStart=null;
    inst.dpDiv.css({
        position:'absolute',
        display:'block',
        top:'-1000px'
    });
    $.datepicker._updateDatepicker(inst);
    inst.dpDiv.width($.datepicker._getNumberOfMonths(inst)[1]*$('.ui-datepicker',inst.dpDiv[0])[0].offsetWidth);
    offset=$.datepicker._checkOffset(inst,offset,isFixed);
    inst.dpDiv.css({
        position:($.datepicker._inDialog&&$.blockUI?'static':(isFixed?'fixed':'absolute')),
        display:'none',
        left:offset.left+'px',
        top:offset.top+'px'
        });
    if(!inst.inline){
        var showAnim=$.datepicker._get(inst,'showAnim')||'show';
        var duration=$.datepicker._get(inst,'duration');
        var postProcess=function(){
            $.datepicker._datepickerShowing=true;
            if($.browser.msie&&parseInt($.browser.version)<7)
                $('iframe.ui-datepicker-cover').css({
                    width:inst.dpDiv.width()+4,
                    height:inst.dpDiv.height()+4
                    });
        };
        
        if($.effects&&$.effects[showAnim])
            inst.dpDiv.show(showAnim,$.datepicker._get(inst,'showOptions'),duration,postProcess);else
            inst.dpDiv[showAnim](duration,postProcess);
        if(duration=='')
            postProcess();
        if(inst.input[0].type!='hidden')
            inst.input[0].focus();
        $.datepicker._curInst=inst;
    }
},
_updateDatepicker:function(inst){
    var dims={
        width:inst.dpDiv.width()+4,
        height:inst.dpDiv.height()+4
        };
        
    inst.dpDiv.empty().append(this._generateDatepicker(inst)).find('iframe.ui-datepicker-cover').css({
        width:dims.width,
        height:dims.height
        });
    var numMonths=this._getNumberOfMonths(inst);
    inst.dpDiv[(numMonths[0]!=1||numMonths[1]!=1?'add':'remove')+'Class']('ui-datepicker-multi');
    inst.dpDiv[(this._get(inst,'isRTL')?'add':'remove')+'Class']('ui-datepicker-rtl');
    if(inst.input&&inst.input[0].type!='hidden')
        $(inst.input[0]).focus();
},
_checkOffset:function(inst,offset,isFixed){
    var pos=inst.input?this._findPos(inst.input[0]):null;
    var browserWidth=window.innerWidth||document.documentElement.clientWidth;
    var browserHeight=window.innerHeight||document.documentElement.clientHeight;
    var scrollX=document.documentElement.scrollLeft||document.body.scrollLeft;
    var scrollY=document.documentElement.scrollTop||document.body.scrollTop;
    if(this._get(inst,'isRTL')||(offset.left+inst.dpDiv.width()-scrollX)>browserWidth)
        offset.left=Math.max((isFixed?0:scrollX),pos[0]+(inst.input?inst.input.width():0)-(isFixed?scrollX:0)-inst.dpDiv.width()-
            (isFixed&&$.browser.opera?document.documentElement.scrollLeft:0));else
        offset.left-=(isFixed?scrollX:0);
    if((offset.top+inst.dpDiv.height()-scrollY)>browserHeight)
        offset.top=Math.max((isFixed?0:scrollY),pos[1]-(isFixed?scrollY:0)-(this._inDialog?0:inst.dpDiv.height())-
            (isFixed&&$.browser.opera?document.documentElement.scrollTop:0));else
        offset.top-=(isFixed?scrollY:0);
    return offset;
},
_findPos:function(obj){
    while(obj&&(obj.type=='hidden'||obj.nodeType!=1)){
        obj=obj.nextSibling;
    }
    var position=$(obj).offset();
    return[position.left,position.top];
},
_hideDatepicker:function(input,duration){
    var inst=this._curInst;
    if(!inst)
        return;
    var rangeSelect=this._get(inst,'rangeSelect');
    if(rangeSelect&&this._stayOpen)
        this._selectDate('#'+inst.id,this._formatDate(inst,inst.currentDay,inst.currentMonth,inst.currentYear));
    this._stayOpen=false;
    if(this._datepickerShowing){
        duration=(duration!=null?duration:this._get(inst,'duration'));
        var showAnim=this._get(inst,'showAnim');
        var postProcess=function(){
            $.datepicker._tidyDialog(inst);
        };
        
        if(duration!=''&&$.effects&&$.effects[showAnim])
            inst.dpDiv.hide(showAnim,$.datepicker._get(inst,'showOptions'),duration,postProcess);else
            inst.dpDiv[(duration==''?'hide':(showAnim=='slideDown'?'slideUp':(showAnim=='fadeIn'?'fadeOut':'hide')))](duration,postProcess);
        if(duration=='')
            this._tidyDialog(inst);
        var onClose=this._get(inst,'onClose');
        if(onClose)
            onClose.apply((inst.input?inst.input[0]:null),[this._getDate(inst),inst]);
        this._datepickerShowing=false;
        this._lastInput=null;
        inst.settings.prompt=null;
        if(this._inDialog){
            this._dialogInput.css({
                position:'absolute',
                left:'0',
                top:'-100px'
            });
            if($.blockUI){
                $.unblockUI();
                $('body').append(this.dpDiv);
            }
        }
    this._inDialog=false;
}
this._curInst=null;
},
_tidyDialog:function(inst){
    inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker');
    $('.'+this._promptClass,inst.dpDiv).remove();
},
_checkExternalClick:function(event){
    if(!$.datepicker._curInst)
        return;
    var $target=$(event.target);
    if(($target.parents('#'+$.datepicker._mainDivId).length==0)&&!$target.hasClass($.datepicker.markerClassName)&&!$target.hasClass($.datepicker._triggerClass)&&$.datepicker._datepickerShowing&&!($.datepicker._inDialog&&$.blockUI))
        $.datepicker._hideDatepicker(null,'');
},
_adjustDate:function(id,offset,period){
    var target=$(id);
    var inst=$.data(target[0],PROP_NAME);
    this._adjustInstDate(inst,offset,period);
    this._updateDatepicker(inst);
},
_gotoToday:function(id){
    var target=$(id);
    var inst=$.data(target[0],PROP_NAME);
    if(this._get(inst,'gotoCurrent')&&inst.currentDay){
        inst.selectedDay=inst.currentDay;
        inst.drawMonth=inst.selectedMonth=inst.currentMonth;
        inst.drawYear=inst.selectedYear=inst.currentYear;
    }
    else{
        var date=new Date();
        inst.selectedDay=date.getDate();
        inst.drawMonth=inst.selectedMonth=date.getMonth();
        inst.drawYear=inst.selectedYear=date.getFullYear();
    }
    this._adjustDate(target);
    this._notifyChange(inst);
},
_selectMonthYear:function(id,select,period){
    var target=$(id);
    var inst=$.data(target[0],PROP_NAME);
    inst._selectingMonthYear=false;
    inst[period=='M'?'drawMonth':'drawYear']=select.options[select.selectedIndex].value-0;
    this._adjustDate(target);
    this._notifyChange(inst);
},
_clickMonthYear:function(id){
    var target=$(id);
    var inst=$.data(target[0],PROP_NAME);
    if(inst.input&&inst._selectingMonthYear&&!$.browser.msie)
        inst.input[0].focus();
    inst._selectingMonthYear=!inst._selectingMonthYear;
},
_changeFirstDay:function(id,day){
    var target=$(id);
    var inst=$.data(target[0],PROP_NAME);
    inst.settings.firstDay=day;
    this._updateDatepicker(inst);
},
_selectDay:function(id,month,year,td){
    if($(td).hasClass(this._unselectableClass))
        return;
    var target=$(id);
    var inst=$.data(target[0],PROP_NAME);
    var rangeSelect=this._get(inst,'rangeSelect');
    if(rangeSelect){
        this._stayOpen=!this._stayOpen;
        if(this._stayOpen){
            $('.ui-datepicker td').removeClass(this._currentClass);
            $(td).addClass(this._currentClass);
        }
    }
inst.selectedDay=inst.currentDay=$('a',td).html();
inst.selectedMonth=inst.currentMonth=month;
inst.selectedYear=inst.currentYear=year;
if(this._stayOpen){
    inst.endDay=inst.endMonth=inst.endYear=null;
}
else if(rangeSelect){
    inst.endDay=inst.currentDay;
    inst.endMonth=inst.currentMonth;
    inst.endYear=inst.currentYear;
}
this._selectDate(id,this._formatDate(inst,inst.currentDay,inst.currentMonth,inst.currentYear));
if(this._stayOpen){
    inst.rangeStart=new Date(inst.currentYear,inst.currentMonth,inst.currentDay);
    this._updateDatepicker(inst);
}
else if(rangeSelect){
    inst.selectedDay=inst.currentDay=inst.rangeStart.getDate();
    inst.selectedMonth=inst.currentMonth=inst.rangeStart.getMonth();
    inst.selectedYear=inst.currentYear=inst.rangeStart.getFullYear();
    inst.rangeStart=null;
    if(inst.inline)
        this._updateDatepicker(inst);
}
},
_clearDate:function(id){
    var target=$(id);
    var inst=$.data(target[0],PROP_NAME);
    if(this._get(inst,'mandatory'))
        return;
    this._stayOpen=false;
    inst.endDay=inst.endMonth=inst.endYear=inst.rangeStart=null;
    this._selectDate(target,'');
},
_selectDate:function(id,dateStr){
    var target=$(id);
    var inst=$.data(target[0],PROP_NAME);
    dateStr=(dateStr!=null?dateStr:this._formatDate(inst));
    if(this._get(inst,'rangeSelect')&&dateStr)
        dateStr=(inst.rangeStart?this._formatDate(inst,inst.rangeStart):dateStr)+this._get(inst,'rangeSeparator')+dateStr;
    if(inst.input)
        inst.input.val(dateStr);
    this._updateAlternate(inst);
    var onSelect=this._get(inst,'onSelect');
    if(onSelect)
        onSelect.apply((inst.input?inst.input[0]:null),[dateStr,inst]);
    else if(inst.input)
        inst.input.trigger('change');
    if(inst.inline)
        this._updateDatepicker(inst);
    else if(!this._stayOpen){
        this._hideDatepicker(null,this._get(inst,'duration'));
        this._lastInput=inst.input[0];
        if(typeof(inst.input[0])!='object')
            inst.input[0].focus();
        this._lastInput=null;
    }
},
_updateAlternate:function(inst){
    var altField=this._get(inst,'altField');
    if(altField){
        var altFormat=this._get(inst,'altFormat');
        var date=this._getDate(inst);
        dateStr=(isArray(date)?(!date[0]&&!date[1]?'':this.formatDate(altFormat,date[0],this._getFormatConfig(inst))+
            this._get(inst,'rangeSeparator')+this.formatDate(altFormat,date[1]||date[0],this._getFormatConfig(inst))):this.formatDate(altFormat,date,this._getFormatConfig(inst)));
        $(altField).each(function(){
            $(this).val(dateStr);
        });
    }
},
noWeekends:function(date){
    var day=date.getDay();
    return[(day>0&&day<6),''];
},
iso8601Week:function(date){
    var checkDate=new Date(date.getFullYear(),date.getMonth(),date.getDate(),(date.getTimezoneOffset()/-60));
    var firstMon=new Date(checkDate.getFullYear(),1-1,4);
    var firstDay=firstMon.getDay()||7;
    firstMon.setDate(firstMon.getDate()+1-firstDay);
    if(firstDay<4&&checkDate<firstMon){
        checkDate.setDate(checkDate.getDate()-3);
        return $.datepicker.iso8601Week(checkDate);
    }else if(checkDate>new Date(checkDate.getFullYear(),12-1,28)){
        firstDay=new Date(checkDate.getFullYear()+1,1-1,4).getDay()||7;
        if(firstDay>4&&(checkDate.getDay()||7)<firstDay-3){
            checkDate.setDate(checkDate.getDate()+3);
            return $.datepicker.iso8601Week(checkDate);
        }
    }
return Math.floor(((checkDate-firstMon)/86400000)/7)+1;
},
dateStatus:function(date,inst){
    return $.datepicker.formatDate($.datepicker._get(inst,'dateStatus'),date,$.datepicker._getFormatConfig(inst));
},
parseDate:function(format,value,settings){
    if(format==null||value==null)
        throw'Invalid arguments';
    value=(typeof value=='object'?value.toString():value+'');
    if(value=='')
        return null;
    var shortYearCutoff=(settings?settings.shortYearCutoff:null)||this._defaults.shortYearCutoff;
    var dayNamesShort=(settings?settings.dayNamesShort:null)||this._defaults.dayNamesShort;
    var dayNames=(settings?settings.dayNames:null)||this._defaults.dayNames;
    var monthNamesShort=(settings?settings.monthNamesShort:null)||this._defaults.monthNamesShort;
    var monthNames=(settings?settings.monthNames:null)||this._defaults.monthNames;
    var year=-1;
    var month=-1;
    var day=-1;
    var literal=false;
    var lookAhead=function(match){
        var matches=(iFormat+1<format.length&&format.charAt(iFormat+1)==match);
        if(matches)
            iFormat++;
        return matches;
    };
    
    var getNumber=function(match){
        lookAhead(match);
        var origSize=(match=='@'?14:(match=='y'?4:2));
        var size=origSize;
        var num=0;
        while(size>0&&iValue<value.length&&value.charAt(iValue)>='0'&&value.charAt(iValue)<='9'){
            num=num*10+(value.charAt(iValue++)-0);
            size--;
        }
        if(size==origSize)
            throw'Missing number at position '+iValue;
        return num;
    };
    
    var getName=function(match,shortNames,longNames){
        var names=(lookAhead(match)?longNames:shortNames);
        var size=0;
        for(var j=0;j<names.length;j++)
            size=Math.max(size,names[j].length);
        var name='';
        var iInit=iValue;
        while(size>0&&iValue<value.length){
            name+=value.charAt(iValue++);
            for(var i=0;i<names.length;i++)
                if(name==names[i])
                    return i+1;size--;
        }
        throw'Unknown name at position '+iInit;
    };
    
    var checkLiteral=function(){
        if(value.charAt(iValue)!=format.charAt(iFormat))
            throw'Unexpected literal at position '+iValue;
        iValue++;
    };
    
    var iValue=0;
    for(var iFormat=0;iFormat<format.length;iFormat++){
        if(literal)
            if(format.charAt(iFormat)=="'"&&!lookAhead("'"))
                literal=false;else
                checkLiteral();else
            switch(format.charAt(iFormat)){
                case'd':
                    day=getNumber('d');
                    break;
                case'D':
                    getName('D',dayNamesShort,dayNames);
                    break;
                case'm':
                    month=getNumber('m');
                    break;
                case'M':
                    month=getName('M',monthNamesShort,monthNames);
                    break;
                case'y':
                    year=getNumber('y');
                    break;
                case'@':
                    var date=new Date(getNumber('@'));
                    year=date.getFullYear();
                    month=date.getMonth()+1;
                    day=date.getDate();
                    break;
                case"'":
                    if(lookAhead("'"))
                    checkLiteral();else
                    literal=true;
                break;
                default:
                    checkLiteral();
            }
        }
if(year<100)
    year+=new Date().getFullYear()-new Date().getFullYear()%100+
    (year<=shortYearCutoff?0:-100);
var date=new Date(year,month-1,day);
if(date.getFullYear()!=year||date.getMonth()+1!=month||date.getDate()!=day)
    throw'Invalid date';
return date;
},
ATOM:'yy-mm-dd',
COOKIE:'D, dd M yy',
ISO_8601:'yy-mm-dd',
RFC_822:'D, d M y',
RFC_850:'DD, dd-M-y',
RFC_1036:'D, d M y',
RFC_1123:'D, d M yy',
RFC_2822:'D, d M yy',
RSS:'D, d M y',
TIMESTAMP:'@',
W3C:'yy-mm-dd',
formatDate:function(format,date,settings){
    if(!date)
        return'';
    var dayNamesShort=(settings?settings.dayNamesShort:null)||this._defaults.dayNamesShort;
    var dayNames=(settings?settings.dayNames:null)||this._defaults.dayNames;
    var monthNamesShort=(settings?settings.monthNamesShort:null)||this._defaults.monthNamesShort;
    var monthNames=(settings?settings.monthNames:null)||this._defaults.monthNames;
    var lookAhead=function(match){
        var matches=(iFormat+1<format.length&&format.charAt(iFormat+1)==match);
        if(matches)
            iFormat++;
        return matches;
    };
    
    var formatNumber=function(match,value){
        return(lookAhead(match)&&value<10?'0':'')+value;
    };
    
    var formatName=function(match,value,shortNames,longNames){
        return(lookAhead(match)?longNames[value]:shortNames[value]);
    };
    
    var output='';
    var literal=false;
    if(date)
        for(var iFormat=0;iFormat<format.length;iFormat++){
            if(literal)
                if(format.charAt(iFormat)=="'"&&!lookAhead("'"))
                    literal=false;else
                    output+=format.charAt(iFormat);else
                switch(format.charAt(iFormat)){
                    case'd':
                        output+=formatNumber('d',date.getDate());
                        break;
                    case'D':
                        output+=formatName('D',date.getDay(),dayNamesShort,dayNames);
                        break;
                    case'm':
                        output+=formatNumber('m',date.getMonth()+1);
                        break;
                    case'M':
                        output+=formatName('M',date.getMonth(),monthNamesShort,monthNames);
                        break;
                    case'y':
                        output+=(lookAhead('y')?date.getFullYear():(date.getYear()%100<10?'0':'')+date.getYear()%100);
                        break;
                    case'@':
                        output+=date.getTime();
                        break;
                    case"'":
                        if(lookAhead("'"))
                        output+="'";else
                        literal=true;
                    break;
                    default:
                        output+=format.charAt(iFormat);
                }
            }
return output;
},
_possibleChars:function(format){
    var chars='';
    var literal=false;
    for(var iFormat=0;iFormat<format.length;iFormat++)
        if(literal)
            if(format.charAt(iFormat)=="'"&&!lookAhead("'"))
                literal=false;else
                chars+=format.charAt(iFormat);else
            switch(format.charAt(iFormat)){
                case'd':case'm':case'y':case'@':
                    chars+='0123456789';
                    break;
                case'D':case'M':
                    return null;
                case"'":
                    if(lookAhead("'"))
                    chars+="'";else
                    literal=true;
                break;
                default:
                    chars+=format.charAt(iFormat);
            }
    return chars;
},
_get:function(inst,name){
    return inst.settings[name]!==undefined?inst.settings[name]:this._defaults[name];
},
_setDateFromField:function(inst){
    var dateFormat=this._get(inst,'dateFormat');
    var dates=inst.input?inst.input.val().split(this._get(inst,'rangeSeparator')):null;
    inst.endDay=inst.endMonth=inst.endYear=null;
    var date=defaultDate=this._getDefaultDate(inst);
    if(dates.length>0){
        var settings=this._getFormatConfig(inst);
        if(dates.length>1){
            date=this.parseDate(dateFormat,dates[1],settings)||defaultDate;
            inst.endDay=date.getDate();
            inst.endMonth=date.getMonth();
            inst.endYear=date.getFullYear();
        }
        try{
            date=this.parseDate(dateFormat,dates[0],settings)||defaultDate;
        }catch(e){
            this.log(e);
            date=defaultDate;
        }
    }
inst.selectedDay=date.getDate();
inst.drawMonth=inst.selectedMonth=date.getMonth();
inst.drawYear=inst.selectedYear=date.getFullYear();
inst.currentDay=(dates[0]?date.getDate():0);
inst.currentMonth=(dates[0]?date.getMonth():0);
inst.currentYear=(dates[0]?date.getFullYear():0);
this._adjustInstDate(inst);
},
_getDefaultDate:function(inst){
    var date=this._determineDate(this._get(inst,'defaultDate'),new Date());
    var minDate=this._getMinMaxDate(inst,'min',true);
    var maxDate=this._getMinMaxDate(inst,'max');
    date=(minDate&&date<minDate?minDate:date);
    date=(maxDate&&date>maxDate?maxDate:date);
    return date;
},
_determineDate:function(date,defaultDate){
    var offsetNumeric=function(offset){
        var date=new Date();
        date.setUTCDate(date.getUTCDate()+offset);
        return date;
    };
    
    var offsetString=function(offset,getDaysInMonth){
        var date=new Date();
        var year=date.getFullYear();
        var month=date.getMonth();
        var day=date.getDate();
        var pattern=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
        var matches=pattern.exec(offset);
        while(matches){
            switch(matches[2]||'d'){
                case'd':case'D':
                    day+=(matches[1]-0);
                    break;
                case'w':case'W':
                    day+=(matches[1]*7);
                    break;
                case'm':case'M':
                    month+=(matches[1]-0);
                    day=Math.min(day,getDaysInMonth(year,month));
                    break;
                case'y':case'Y':
                    year+=(matches[1]-0);
                    day=Math.min(day,getDaysInMonth(year,month));
                    break;
            }
            matches=pattern.exec(offset);
        }
        return new Date(year,month,day);
    };
    
    return(date==null?defaultDate:(typeof date=='string'?offsetString(date,this._getDaysInMonth):(typeof date=='number'?offsetNumeric(date):date)));
},
_setDate:function(inst,date,endDate){
    var clear=!(date);
    date=this._determineDate(date,new Date());
    inst.selectedDay=inst.currentDay=date.getDate();
    inst.drawMonth=inst.selectedMonth=inst.currentMonth=date.getMonth();
    inst.drawYear=inst.selectedYear=inst.currentYear=date.getFullYear();
    if(this._get(inst,'rangeSelect')){
        if(endDate){
            endDate=this._determineDate(endDate,null);
            inst.endDay=endDate.getDate();
            inst.endMonth=endDate.getMonth();
            inst.endYear=endDate.getFullYear();
        }else{
            inst.endDay=inst.currentDay;
            inst.endMonth=inst.currentMonth;
            inst.endYear=inst.currentYear;
        }
    }
this._adjustInstDate(inst);
if(inst.input)
    inst.input.val(clear?'':this._formatDate(inst)+
        (!this._get(inst,'rangeSelect')?'':this._get(inst,'rangeSeparator')+
            this._formatDate(inst,inst.endDay,inst.endMonth,inst.endYear)));
},
_getDate:function(inst){
    var startDate=(!inst.currentYear||(inst.input&&inst.input.val()=='')?null:new Date(inst.currentYear,inst.currentMonth,inst.currentDay));
    if(this._get(inst,'rangeSelect')){
        return[inst.rangeStart||startDate,(!inst.endYear?null:new Date(inst.endYear,inst.endMonth,inst.endDay))];
    }else
        return startDate;
},
_generateDatepicker:function(inst){
    var today=new Date();
    today=new Date(today.getFullYear(),today.getMonth(),today.getDate());
    var showStatus=this._get(inst,'showStatus');
    var isRTL=this._get(inst,'isRTL');
    var clear=(this._get(inst,'mandatory')?'':'<div class="ui-datepicker-clear"><a onclick="jQuery.datepicker._clearDate(\'#'+inst.id+'\');"'+
        (showStatus?this._addStatus(inst,this._get(inst,'clearStatus')||'&#xa0;'):'')+'>'+
        this._get(inst,'clearText')+'</a></div>');
    var controls='<div class="ui-datepicker-control">'+(isRTL?'':clear)+'<div class="ui-datepicker-close"><a onclick="jQuery.datepicker._hideDatepicker();"'+
    (showStatus?this._addStatus(inst,this._get(inst,'closeStatus')||'&#xa0;'):'')+'>'+
    this._get(inst,'closeText')+'</a></div>'+(isRTL?clear:'')+'</div>';
    var prompt=this._get(inst,'prompt');
    var closeAtTop=this._get(inst,'closeAtTop');
    var hideIfNoPrevNext=this._get(inst,'hideIfNoPrevNext');
    var navigationAsDateFormat=this._get(inst,'navigationAsDateFormat');
    var numMonths=this._getNumberOfMonths(inst);
    var stepMonths=this._get(inst,'stepMonths');
    var isMultiMonth=(numMonths[0]!=1||numMonths[1]!=1);
    var currentDate=(!inst.currentDay?new Date(9999,9,9):new Date(inst.currentYear,inst.currentMonth,inst.currentDay));
    var minDate=this._getMinMaxDate(inst,'min',true);
    var maxDate=this._getMinMaxDate(inst,'max');
    var drawMonth=inst.drawMonth;
    var drawYear=inst.drawYear;
    if(maxDate){
        var maxDraw=new Date(maxDate.getFullYear(),maxDate.getMonth()-numMonths[1]+1,maxDate.getDate());
        maxDraw=(minDate&&maxDraw<minDate?minDate:maxDraw);
        while(new Date(drawYear,drawMonth,1)>maxDraw){
            drawMonth--;
            if(drawMonth<0){
                drawMonth=11;
                drawYear--;
            }
        }
    }
var prevText=this._get(inst,'prevText');
prevText=(!navigationAsDateFormat?prevText:this.formatDate(prevText,new Date(drawYear,drawMonth-stepMonths,1),this._getFormatConfig(inst)));
var prev='<div class="ui-datepicker-prev">'+(this._canAdjustMonth(inst,-1,drawYear,drawMonth)?'<a onclick="jQuery.datepicker._adjustDate(\'#'+inst.id+'\', -'+stepMonths+', \'M\');"'+
    (showStatus?this._addStatus(inst,this._get(inst,'prevStatus')||'&#xa0;'):'')+'>'+prevText+'</a>':(hideIfNoPrevNext?'':'<label>'+prevText+'</label>'))+'</div>';
var nextText=this._get(inst,'nextText');
nextText=(!navigationAsDateFormat?nextText:this.formatDate(nextText,new Date(drawYear,drawMonth+stepMonths,1),this._getFormatConfig(inst)));
var next='<div class="ui-datepicker-next">'+(this._canAdjustMonth(inst,+1,drawYear,drawMonth)?'<a onclick="jQuery.datepicker._adjustDate(\'#'+inst.id+'\', +'+stepMonths+', \'M\');"'+
    (showStatus?this._addStatus(inst,this._get(inst,'nextStatus')||'&#xa0;'):'')+'>'+nextText+'</a>':(hideIfNoPrevNext?'':'<label>'+nextText+'</label>'))+'</div>';
var currentText=this._get(inst,'currentText');
currentText=(!navigationAsDateFormat?currentText:this.formatDate(currentText,today,this._getFormatConfig(inst)));
var html=(prompt?'<div class="'+this._promptClass+'">'+prompt+'</div>':'')+
(closeAtTop&&!inst.inline?controls:'')+'<div class="ui-datepicker-links">'+(isRTL?next:prev)+
(this._isInRange(inst,(this._get(inst,'gotoCurrent')&&inst.currentDay?currentDate:today))?'<div class="ui-datepicker-current">'+'<a onclick="jQuery.datepicker._gotoToday(\'#'+inst.id+'\');"'+
    (showStatus?this._addStatus(inst,this._get(inst,'currentStatus')||'&#xa0;'):'')+'>'+
    currentText+'</a></div>':'')+(isRTL?prev:next)+'</div>';
var firstDay=this._get(inst,'firstDay');
var changeFirstDay=this._get(inst,'changeFirstDay');
var dayNames=this._get(inst,'dayNames');
var dayNamesShort=this._get(inst,'dayNamesShort');
var dayNamesMin=this._get(inst,'dayNamesMin');
var monthNames=this._get(inst,'monthNames');
var beforeShowDay=this._get(inst,'beforeShowDay');
var highlightWeek=this._get(inst,'highlightWeek');
var showOtherMonths=this._get(inst,'showOtherMonths');
var showWeeks=this._get(inst,'showWeeks');
var calculateWeek=this._get(inst,'calculateWeek')||this.iso8601Week;
var status=(showStatus?this._get(inst,'dayStatus')||'&#xa0;':'');
var dateStatus=this._get(inst,'statusForDate')||this.dateStatus;
var endDate=inst.endDay?new Date(inst.endYear,inst.endMonth,inst.endDay):currentDate;
for(var row=0;row<numMonths[0];row++)
    for(var col=0;col<numMonths[1];col++){
        var selectedDate=new Date(drawYear,drawMonth,inst.selectedDay);
        html+='<div class="ui-datepicker-one-month'+(col==0?' ui-datepicker-new-row':'')+'">'+
        this._generateMonthYearHeader(inst,drawMonth,drawYear,minDate,maxDate,selectedDate,row>0||col>0,showStatus,monthNames)+'<table class="ui-datepicker" cellpadding="0" cellspacing="0"><thead>'+'<tr class="ui-datepicker-title-row">'+
        (showWeeks?'<td>'+this._get(inst,'weekHeader')+'</td>':'');
        for(var dow=0;dow<7;dow++){
            var day=(dow+firstDay)%7;
            var dayStatus=(status.indexOf('DD')>-1?status.replace(/DD/,dayNames[day]):status.replace(/D/,dayNamesShort[day]));
            html+='<td'+((dow+firstDay+6)%7>=5?' class="ui-datepicker-week-end-cell"':'')+'>'+
            (!changeFirstDay?'<span':'<a onclick="jQuery.datepicker._changeFirstDay(\'#'+inst.id+'\', '+day+');"')+
            (showStatus?this._addStatus(inst,dayStatus):'')+' title="'+dayNames[day]+'">'+
            dayNamesMin[day]+(changeFirstDay?'</a>':'</span>')+'</td>';
        }
        html+='</tr></thead><tbody>';
        var daysInMonth=this._getDaysInMonth(drawYear,drawMonth);
        if(drawYear==inst.selectedYear&&drawMonth==inst.selectedMonth)
            inst.selectedDay=Math.min(inst.selectedDay,daysInMonth);
        var leadDays=(this._getFirstDayOfMonth(drawYear,drawMonth)-firstDay+7)%7;
        var printDate=new Date(drawYear,drawMonth,1-leadDays);
        var numRows=(isMultiMonth?6:Math.ceil((leadDays+daysInMonth)/7));
        for(var dRow=0;dRow<numRows;dRow++){
            html+='<tr class="ui-datepicker-days-row">'+
            (showWeeks?'<td class="ui-datepicker-week-col">'+calculateWeek(printDate)+'</td>':'');
            for(var dow=0;dow<7;dow++){
                var daySettings=(beforeShowDay?beforeShowDay.apply((inst.input?inst.input[0]:null),[printDate]):[true,'']);
                var otherMonth=(printDate.getMonth()!=drawMonth);
                var unselectable=otherMonth||!daySettings[0]||(minDate&&printDate<minDate)||(maxDate&&printDate>maxDate);
                html+='<td class="ui-datepicker-days-cell'+
                ((dow+firstDay+6)%7>=5?' ui-datepicker-week-end-cell':'')+
                (otherMonth?' ui-datepicker-otherMonth':'')+
                (printDate.getTime()==selectedDate.getTime()&&drawMonth==inst.selectedMonth?' ui-datepicker-days-cell-over':'')+
                (unselectable?' '+this._unselectableClass:'')+
                (otherMonth&&!showOtherMonths?'':' '+daySettings[1]+
                    (printDate.getTime()>=currentDate.getTime()&&printDate.getTime()<=endDate.getTime()?' '+this._currentClass:'')+
                    (printDate.getTime()==today.getTime()?' ui-datepicker-today':''))+'"'+
                ((!otherMonth||showOtherMonths)&&daySettings[2]?' title="'+daySettings[2]+'"':'')+
                (unselectable?(highlightWeek?' onmouseover="jQuery(this).parent().addClass(\'ui-datepicker-week-over\');"'+' onmouseout="jQuery(this).parent().removeClass(\'ui-datepicker-week-over\');"':''):' onmouseover="jQuery(this).addClass(\'ui-datepicker-days-cell-over\')'+
                    (highlightWeek?'.parent().addClass(\'ui-datepicker-week-over\')':'')+';'+
                    (!showStatus||(otherMonth&&!showOtherMonths)?'':'jQuery(\'#ui-datepicker-status-'+
                        inst.id+'\').html(\''+(dateStatus.apply((inst.input?inst.input[0]:null),[printDate,inst])||'&#xa0;')+'\');')+'"'+' onmouseout="jQuery(this).removeClass(\'ui-datepicker-days-cell-over\')'+
                    (highlightWeek?'.parent().removeClass(\'ui-datepicker-week-over\')':'')+';'+
                    (!showStatus||(otherMonth&&!showOtherMonths)?'':'jQuery(\'#ui-datepicker-status-'+
                        inst.id+'\').html(\'&#xa0;\');')+'" onclick="jQuery.datepicker._selectDay(\'#'+
                    inst.id+'\','+drawMonth+','+drawYear+', this);"')+'>'+
                (otherMonth?(showOtherMonths?printDate.getDate():'&#xa0;'):(unselectable?printDate.getDate():'<a>'+printDate.getDate()+'</a>'))+'</td>';
                printDate.setUTCDate(printDate.getUTCDate()+1);
            }
            html+='</tr>';
        }
        drawMonth++;
        if(drawMonth>11){
            drawMonth=0;
            drawYear++;
        }
        html+='</tbody></table></div>';
    }
html+=(showStatus?'<div style="clear: both;"></div><div id="ui-datepicker-status-'+inst.id+'" class="ui-datepicker-status">'+(this._get(inst,'initStatus')||'&#xa0;')+'</div>':'')+
(!closeAtTop&&!inst.inline?controls:'')+'<div style="clear: both;"></div>'+
($.browser.msie&&parseInt($.browser.version)<7&&!inst.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover"></iframe>':'');
return html;
},
_generateMonthYearHeader:function(inst,drawMonth,drawYear,minDate,maxDate,selectedDate,secondary,showStatus,monthNames){
    minDate=(inst.rangeStart&&minDate&&selectedDate<minDate?selectedDate:minDate);
    var html='<div class="ui-datepicker-header">';
    if(secondary||!this._get(inst,'changeMonth'))
        html+=monthNames[drawMonth]+'&#xa0;';
    else{
        var inMinYear=(minDate&&minDate.getFullYear()==drawYear);
        var inMaxYear=(maxDate&&maxDate.getFullYear()==drawYear);
        html+='<select class="ui-datepicker-new-month" '+'onchange="jQuery.datepicker._selectMonthYear(\'#'+inst.id+'\', this, \'M\');" '+'onclick="jQuery.datepicker._clickMonthYear(\'#'+inst.id+'\');"'+
        (showStatus?this._addStatus(inst,this._get(inst,'monthStatus')||'&#xa0;'):'')+'>';
        for(var month=0;month<12;month++){
            if((!inMinYear||month>=minDate.getMonth())&&(!inMaxYear||month<=maxDate.getMonth()))
                html+='<option value="'+month+'"'+
                (month==drawMonth?' selected="selected"':'')+'>'+monthNames[month]+'</option>';
        }
        html+='</select>';
    }
    if(secondary||!this._get(inst,'changeYear'))
        html+=drawYear;
    else{
        var years=this._get(inst,'yearRange').split(':');
        var year=0;
        var endYear=0;
        if(years.length!=2){
            year=drawYear-10;
            endYear=drawYear+10;
        }else if(years[0].charAt(0)=='+'||years[0].charAt(0)=='-'){
            year=endYear=new Date().getFullYear();
            year+=parseInt(years[0],10);
            endYear+=parseInt(years[1],10);
        }else{
            year=parseInt(years[0],10);
            endYear=parseInt(years[1],10);
        }
        year=(minDate?Math.max(year,minDate.getFullYear()):year);
        endYear=(maxDate?Math.min(endYear,maxDate.getFullYear()):endYear);
        html+='<select class="ui-datepicker-new-year" '+'onchange="jQuery.datepicker._selectMonthYear(\'#'+inst.id+'\', this, \'Y\');" '+'onclick="jQuery.datepicker._clickMonthYear(\'#'+inst.id+'\');"'+
        (showStatus?this._addStatus(inst,this._get(inst,'yearStatus')||'&#xa0;'):'')+'>';
        for(;year<=endYear;year++){
            html+='<option value="'+year+'"'+
            (year==drawYear?' selected="selected"':'')+'>'+year+'</option>';
        }
        html+='</select>';
    }
    html+='</div>';
    return html;
},
_addStatus:function(inst,text){
    return' onmouseover="jQuery(\'#ui-datepicker-status-'+inst.id+'\').html(\''+text+'\');" '+'onmouseout="jQuery(\'#ui-datepicker-status-'+inst.id+'\').html(\'&#xa0;\');"';
},
_adjustInstDate:function(inst,offset,period){
    var year=inst.drawYear+(period=='Y'?offset:0);
    var month=inst.drawMonth+(period=='M'?offset:0);
    var day=Math.min(inst.selectedDay,this._getDaysInMonth(year,month))+
    (period=='D'?offset:0);
    var date=new Date(year,month,day);
    var minDate=this._getMinMaxDate(inst,'min',true);
    var maxDate=this._getMinMaxDate(inst,'max');
    date=(minDate&&date<minDate?minDate:date);
    date=(maxDate&&date>maxDate?maxDate:date);
    inst.selectedDay=date.getDate();
    inst.drawMonth=inst.selectedMonth=date.getMonth();
    inst.drawYear=inst.selectedYear=date.getFullYear();
    if(period=='M'||period=='Y')
        this._notifyChange(inst);
},
_notifyChange:function(inst){
    var onChange=this._get(inst,'onChangeMonthYear');
    if(onChange)
        onChange.apply((inst.input?inst.input[0]:null),[new Date(inst.selectedYear,inst.selectedMonth,1),inst]);
},
_getNumberOfMonths:function(inst){
    var numMonths=this._get(inst,'numberOfMonths');
    return(numMonths==null?[1,1]:(typeof numMonths=='number'?[1,numMonths]:numMonths));
},
_getMinMaxDate:function(inst,minMax,checkRange){
    var date=this._determineDate(this._get(inst,minMax+'Date'),null);
    if(date){
        date.setHours(0);
        date.setMinutes(0);
        date.setSeconds(0);
        date.setMilliseconds(0);
    }
    return(!checkRange||!inst.rangeStart?date:(!date||inst.rangeStart>date?inst.rangeStart:date));
},
_getDaysInMonth:function(year,month){
    return 32-new Date(year,month,32).getDate();
},
_getFirstDayOfMonth:function(year,month){
    return new Date(year,month,1).getDay();
},
_canAdjustMonth:function(inst,offset,curYear,curMonth){
    var numMonths=this._getNumberOfMonths(inst);
    var date=new Date(curYear,curMonth+(offset<0?offset:numMonths[1]),1);
    if(offset<0)
        date.setDate(this._getDaysInMonth(date.getFullYear(),date.getMonth()));
    return this._isInRange(inst,date);
},
_isInRange:function(inst,date){
    var newMinDate=(!inst.rangeStart?null:new Date(inst.selectedYear,inst.selectedMonth,inst.selectedDay));
    newMinDate=(newMinDate&&inst.rangeStart<newMinDate?inst.rangeStart:newMinDate);
    var minDate=newMinDate||this._getMinMaxDate(inst,'min');
    var maxDate=this._getMinMaxDate(inst,'max');
    return((!minDate||date>=minDate)&&(!maxDate||date<=maxDate));
},
_getFormatConfig:function(inst){
    var shortYearCutoff=this._get(inst,'shortYearCutoff');
    shortYearCutoff=(typeof shortYearCutoff!='string'?shortYearCutoff:new Date().getFullYear()%100+parseInt(shortYearCutoff,10));
    return{
        shortYearCutoff:shortYearCutoff,
        dayNamesShort:this._get(inst,'dayNamesShort'),
        dayNames:this._get(inst,'dayNames'),
        monthNamesShort:this._get(inst,'monthNamesShort'),
        monthNames:this._get(inst,'monthNames')
        };
    
},
_formatDate:function(inst,day,month,year){
    if(!day){
        inst.currentDay=inst.selectedDay;
        inst.currentMonth=inst.selectedMonth;
        inst.currentYear=inst.selectedYear;
    }
    var date=(day?(typeof day=='object'?day:new Date(year,month,day)):new Date(inst.currentYear,inst.currentMonth,inst.currentDay));
    return this.formatDate(this._get(inst,'dateFormat'),date,this._getFormatConfig(inst));
}
});
function extendRemove(target,props){
    $.extend(target,props);
    for(var name in props)
        if(props[name]==null||props[name]==undefined)
            target[name]=props[name];return target;
};

function isArray(a){
    return(a&&(($.browser.safari&&typeof a=='object'&&a.length)||(a.constructor&&a.constructor.toString().match(/\Array\(\)/))));
};

$.fn.datepicker=function(options){
    var otherArgs=Array.prototype.slice.call(arguments,1);
    if(typeof options=='string'&&(options=='isDisabled'||options=='getDate'))
        return $.datepicker['_'+options+'Datepicker'].apply($.datepicker,[this[0]].concat(otherArgs));
    return this.each(function(){
        typeof options=='string'?$.datepicker['_'+options+'Datepicker'].apply($.datepicker,[this].concat(otherArgs)):$.datepicker._attachDatepicker(this,options);
    });
};

$.datepicker=new Datepicker();
$(document).ready(function(){
    $(document.body).append($.datepicker.dpDiv).mousedown($.datepicker._checkExternalClick);
});
})(jQuery);